package com.zkq.graduate.util;

import com.zkq.graduate.conf.MyConfigBean;
import com.zkq.graduate.enums.DateTimeFormatterEnum;
import com.zkq.graduate.pojo.StudentWithReport;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @Author zhangkaiqiang
 * @Date 2019/12/12  17:12
 * @Description TODO
 *
 * 文件的上传与下载工具类
 */
@Slf4j
@Component
public class FileUtil {

	/**
	 * 通过这种方式向工具类中注入配置文件中的值
	 */
	private static MyConfigBean myConfig;


	@Autowired
	public void init(MyConfigBean myConfig){
		FileUtil.myConfig=myConfig;
	}

	/**
	 * 得到上传文件的二进制数据
	 * @param file 上传的文件
	 * @return
	 */
	public static byte[] getMultipartFileByte(MultipartFile file){
		byte[] bytes=null;
		try {
			bytes= file.getBytes();
		} catch (IOException e) {
			log.debug("获得上传文件byte数组异常"+e.toString());
		}
		return bytes;
	}


	/**
	 * 得到一个普通文件的二进制数据--记得关闭流
	 * @param file
	 * @return
	 */
	public static byte[] getFileByte(File file){
		byte [] bytes=new byte[(int) file.length()];
		try {
			InputStream in=new FileInputStream(file);
			BufferedInputStream buffer=new BufferedInputStream(in);
			buffer.read(bytes);
			buffer.close();
			in.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return bytes.length !=0 ? bytes:new byte[0];
	}


	/**
	 * 设定上传文件的名称为:
	 * 毕业论文:姓名+毕业设计论文+时间
	 * 开题报告:姓名+开题报告+时间
	 * @param file
	 * @return
	 */
	public static String getFileName(MultipartFile file, String studentId,String studentName,String flag){
		String fileName=file.getOriginalFilename();
		String now=LocalDateTimeUtil.formatLocalDateTime(LocalDateTime.now(), DateTimeFormatterEnum.DEFAULT).replaceAll(":","");
		if(Objects.equals("open",flag)){
			fileName= new StringBuilder((studentId)).append("-").append(studentName).append("开题报告").append("-").append(now).append(".docx").toString();
		} else if(Objects.equals("paper",flag)){
			fileName= new StringBuilder((studentId)).append("-").append(studentName).append("毕业论文").append("-").append(now).append(".docx").toString();
		}
		return fileName;
	}


	/**
	 *教师审核文件时从mongodb中拿出文件,在服务器生成一个临时文件进行编辑
	 * @param stu 学号 文档等信息
	 * @return
	 */
	public  static String createOneFile(StudentWithReport stu){

		String parentFilePath=myConfig.getStorePath();
		String filePath="";

		// 设定开题报告和毕业论文不同的保存路径
		if(FileUtil.fileType(stu.getFileName())==1){
			filePath=new StringBuilder(parentFilePath).append("open").append(File.separator).append(stu.getFileName()).toString();
		} else if(FileUtil.fileType(stu.getFileName())==2){
			filePath=new StringBuilder(parentFilePath).append("paper").append(File.separator).append(stu.getFileName()).toString();
		}

		 //如果存在该文件,直接返回文件路径
		if(FileUtil.ifExistsFile(parentFilePath,filePath)){
			return filePath;
		}

		File file=new File(filePath);
		OutputStream outputStream=null;
		if(!file.getParentFile().exists()){
			file.getParentFile().mkdirs();
		}

		// 创建并向文件中写入内容
		try {
			file.createNewFile();
			outputStream=new FileOutputStream(file);
			outputStream.write(stu.getFileContext());
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(outputStream!=null){
				try{
					outputStream.close();
				}catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return filePath;
	}


	/**
	 * 判断文件是开题报告还是毕业论文
	 * @param fileName
	 * @return
	 */
	public static int fileType(String fileName){
		if(fileName.contains("开题报告")){
			return 1;
		} else if (fileName.contains("毕业论文")){
			return 2;
		}
		return -1;
	}


	/**
	 * 得到某个目录下的所有文件
	 */
	public static List<File> getAllFile(String filePath){
		List<File> allFile=new ArrayList<>();
		if(StringUtils.isNotBlank(filePath)){
			File file=new File(filePath);
			if(!file.isDirectory()){
				allFile.add(file);
			} else {
				File[] files=file.listFiles();
				if(files!=null &&files.length!=0){
					for(File temp:files){
						List<File> tempList=getAllFile(temp.getPath());
						allFile.addAll(tempList);
					}
				}
			}
		} else{
			throw new IllegalArgumentException("filePath is null or ''");
		}
		return allFile;
	}

	/**
	 * 判断某个路径下是否存在某个文件
	 */
	public static boolean ifExistsFile(String directoryPath,String filePath){
		List<File> files=getAllFile(directoryPath);
		if(files.contains(new File(filePath))){
			return true;
		}
		return false;
	}
}
